package com.archerdu.base.dao;

import java.util.List;

/**
 * 分页对象
 * 
 * @projectName springDemo
 * @description 分页对象
 * @author archer du
 * @createDate 2013年9月27日 下午5:27:57
 * @updateUser dxf
 * @updateDate 2013年9月27日 下午5:27:57
 * @updateRemark 新建
 * @version 0.0.1
 */
public class Page<T> implements IPage<T> {

    private static final long serialVersionUID = 7315741544248507893L;
    private Integer           pageNo;
    private Integer           pageSize;
    private Long              total;
    private List<T>           list;

    public Page() {

    }

    public Page(int pageNo, int pageSize) {

        // 默认第一页
        this.pageNo = pageNo < 1 ? 1 : pageNo;
        // 默认每页20条记录
        this.pageSize = pageSize < 1 ? 20 : pageSize;
    }

    @Override
    public String getPageContent(String url) {

        // 主体内容
        StringBuffer content = new StringBuffer("");
        // 起始页
        int begin = 1;
        // 结束页
        int end = 1;
        // 总页数
        int num = this.getPageCount();
        // 当前页大于总页码，设置总页码为当前页
        if (pageNo != 1 && pageNo > num)
            pageNo = num;

        // 为url添加 ? 或 &
        if (url.indexOf("?") != -1) {
            url = url + "&";
        } else {
            url = url + "?";
        }
        // 判断分页起始标示，不是1位，添加首页标示
        if (pageNo > 5 && num > 10) {
            begin = pageNo - 4;
            content.append("<a class=\"page_end\" href=\"").append(url).append("pageNo=1&pageSize=").append(pageSize)
                    .append("\">首页</a>");
            if (begin > num - 9) {
                begin = num - 9;
            }
        }
        // 判断分页结束标示，每组不够10位，则显示实际数目
        end = begin + 10;
        if (begin + 10 > num || num <= 10) {
            end = num + 1;
        }

        // 生成分页标示
        for (int i = begin; i < end; i++) {
            if (i == pageNo) {
                content.append("<a class=\"page_focus\" href=\"");
            } else {
                content.append("<a class=\"page_num\" href=\"");
            }
            content.append(url).append("pageNo=").append(i).append("&pageSize=").append(pageSize).append("\">")
                    .append(i).append("</a>");

        }
        // 总数大于分组则显示尾页标示
        if (num >= begin + 10) {
            content.append("<a class=\"page_end\" href=\"").append(url).append("pageNo=").append(num)
                    .append("&pageSize=").append(pageSize).append("\">尾页</a>");
        }
        content.append("<span class=\"page_count\"> 共 ").append(num).append(" 页  ").append(total).append("条数据</div>");
        return content.toString();
    }

    @SuppressWarnings("rawtypes")
    public static void main(String[] args) {
        Page page = new Page(1, 20);
        page.setTotal(0L);
        System.out.println(page.getPageContent(""));
        page.setTotal(4L);
        System.out.println(page.getPageContent(""));
        page.setTotal(21L);
        System.out.println(page.getPageContent(""));
        page.setTotal(1002L);
        System.out.println(page.getPageContent(""));
        page.setTotal(1002L);
        page.setPageNo(20);
        System.out.println(page.getPageContent(""));
        page.setTotal(1002L);
        page.setPageNo(49);
        System.out.println(page.getPageContent(""));
    }

    public int getPageCount() {

        if (total == null || total.equals(0L))
            return 0;
        return (int) ((total - 1) / pageSize + 1);
    }

    public Integer getPageNo() {

        return pageNo;
    }

    public void setPageNo(Integer pageNo) {

        this.pageNo = pageNo;
    }

    public Integer getPageSize() {

        return pageSize;
    }

    public void setPageSize(Integer pageSize) {

        this.pageSize = pageSize;
    }

    public Long getTotal() {

        return total;
    }

    public void setTotal(Long total) {

        this.total = total;
    }

    public List<T> getList() {

        return list;
    }

    public void setList(List<T> list) {

        this.list = list;
    }

    @Override
    public Integer getFitstIndex() {

        return (pageNo - 1) * pageSize;
    }

    @Override
    public Integer getMaxIndex() {

        return pageSize;
    }

}
